﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using DataAccessLayer;
using DTO;
using System.Configuration;
using System.Data;

namespace DAL
{
    public class LichSuGiaoDichDAL
    {
        private DBManager _dbmanager;

        #region Phương thức khởi tạo mặc định
        /// <summary>
        /// Phương thức khởi tạo mặc định
        /// </summary>
        public LichSuGiaoDichDAL()
        {
            string _connectionInfo = ConfigurationManager.AppSettings["ConnectionInfo"];
            _dbmanager = new DBManager(DataProvider.SqlServer, _connectionInfo);
        }
        #endregion

        #region Phương thức tạo 1 object từ Data Reader       
        private LichSuGiaoDichDTO CreateLichSuGiaoDichFromReader(IDataReader reader)
        {
            LichSuGiaoDichDTO _lsgdDTO = new LichSuGiaoDichDTO();
            _lsgdDTO.MaLichSuGiaoDich = Convert.ToInt32(reader["MaLichSuGiaoDich"]);
            _lsgdDTO.MaNguoiDung = Convert.ToString(reader["MaNguoiDung"]);
            _lsgdDTO.TenNguoiDung = Convert.ToString(reader["TenNguoiDung"]);
            _lsgdDTO.NgayGiaoDich = Convert.ToDateTime(reader["NgayGiaoDich"]);
            _lsgdDTO.NoiDungGiaoDich = Convert.ToString(reader["NoiDungGiaoDich"]);
            _lsgdDTO.GhiChu = Convert.ToString(reader["GhiChu"]);
            return _lsgdDTO;
        }
        #endregion

        #region Phương thức lấy danh sách lịch sử giao dịch       
        public List<LichSuGiaoDichDTO> GetListLichSuGiaoDich()
        {

            List<LichSuGiaoDichDTO> _lst = new List<LichSuGiaoDichDTO>();
            IDataReader _reader = null;
            try
            {
                _dbmanager.Open();
                _reader = _dbmanager.ExecuteReader(CommandType.StoredProcedure, "usp_getListLichSuGiaoDich");
                while (_reader.Read())
                    _lst.Add(this.CreateLichSuGiaoDichFromReader(_reader));
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_reader != null)
                    _reader.Close();
            }
            return _lst;
            
        }
        #endregion

        #region Phương thức lấy thông tin 1 lịch sử giao dịch dựa vào mã lịch sử giao dịch
        
        public LichSuGiaoDichDTO GetLichSuGiaoDich(int malsgd)
        {            
            LichSuGiaoDichDTO _lsgdDTO = new LichSuGiaoDichDTO();
            IDataReader _reader = null;
            try
            {
                _dbmanager.Open();
                _dbmanager.CreateParameters(1);
                _dbmanager.AddParameters(0, "@ma_lsgd", malsgd);
                _reader = _dbmanager.ExecuteReader(CommandType.StoredProcedure, "usp_getLichSuGiaoDich");
                while (_reader.Read())
                    _lsgdDTO = this.CreateLichSuGiaoDichFromReader(_reader);
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_reader != null)
                    _reader.Close();
            }
            return _lsgdDTO;
            
        }
        #endregion

        #region Phương thức lấy danh sách lịch sử giao dịch có bộ lọc
        /// <summary>
        /// Phương thức lấy danh sách lịch sử giao dịch có bộ lọc
        /// </summary>
        /// <param name="tungay">DateTime - Từ ngày</param>
        /// <param name="denngay">DateTime - Đến ngày</param>
        /// <returns>List</returns>
        public List<LichSuGiaoDichDTO> GetListLichSuGiaoDich(DateTime tungay, DateTime denngay)
        {

            List<LichSuGiaoDichDTO> _lst = new List<LichSuGiaoDichDTO>();
            IDataReader _reader = null;
            try
            {
                _dbmanager.Open();
                _dbmanager.CreateParameters(2);
                _dbmanager.AddParameters(0, "@tungay", tungay);
                _dbmanager.AddParameters(1, "@denngay", denngay);
                _reader = _dbmanager.ExecuteReader(CommandType.StoredProcedure, "getLichSuGiaoDichFromDateToDate");
                while (_reader.Read())
                    _lst.Add(this.CreateLichSuGiaoDichFromReader(_reader));
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_reader != null)
                    _reader.Close();
            }
            return _lst;

        }
        #endregion

        #region Phương thức thêm 1 lịch sử giao dịch 
        public int Them(LichSuGiaoDichDTO lsgdDTO)
        {
            
            int _index = -1;
            try
            {
                // Mở kết nối
                _dbmanager.Open();

                // Thực thi câu truy vấn                
                _dbmanager.CreateParameters(5);
                //_dbmanager.AddParameters(0, "@ma_lsgdDTO", lsgdDTO.MaLichSuGiaoDich); -- Generation
                _dbmanager.AddParameters(0, "@ma_nd", lsgdDTO.MaNguoiDung);
                _dbmanager.AddParameters(1, "@ten_nd", lsgdDTO.TenNguoiDung);
                _dbmanager.AddParameters(2, "@ngay_gd", lsgdDTO.NgayGiaoDich);
                _dbmanager.AddParameters(3, "@noi_dgd", lsgdDTO.NoiDungGiaoDich);
                _dbmanager.AddParameters(4, "@ghichu", lsgdDTO.GhiChu);

                _index = _dbmanager.ExecuteNonQuery(CommandType.StoredProcedure, "usp_ThemLichSuGiaoDich");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_dbmanager.Connection.State == ConnectionState.Open)
                    _dbmanager.Close();
            }

            return _index;
            
        }
        #endregion

        #region Phương thức sửa thông tin 1 lịch sử giao dịch
        ///// <summary>
        ///// Phương thức sửa thông tin 1 lịch sử giao dịch
        ///// </summary>
        ///// <param name="lsgd"></param>
        ///// <returns></returns>
        //public int Sua(LichSuGiaoDichDTO lsgdDTO)
        //{
            
        //    int _index = -1;
        //    try
        //    {
        //        // Mở kết nối
        //        _dbmanager.Open();

        //        // Thực thi câu truy vấn                
        //        _dbmanager.CreateParameters(5);
        //        //_dbmanager.AddParameters(0, "@ma_lsgd", lsgd.MaLichSuGiaoDich); -- Generation
        //        _dbmanager.AddParameters(0, "@ma_nd", lsgdDTO.MaNguoiDung);
        //        _dbmanager.AddParameters(1, "@ten_nd", lsgdDTO.TenNguoiDung);
        //        _dbmanager.AddParameters(2, "@ngay_gd", lsgdDTO.NgayGiaoDich);
        //        _dbmanager.AddParameters(3, "@noi_dgd", lsgdDTO.NoiDungGiaoDich);
        //        _dbmanager.AddParameters(4, "@ghichu", lsgdDTO.GhiChu);

        //        _index = _dbmanager.ExecuteNonQuery(CommandType.StoredProcedure, "usp_CapNhatLichSuGiaoDich");
        //    }
        //    catch (Exception ex)
        //    {
        //        throw new Exception(ex.Message);
        //    }
        //    finally
        //    {
        //        if (_dbmanager.Connection.State == ConnectionState.Open)
        //            _dbmanager.Close();
        //    }

        //    return _index;
            
        //}
        #endregion

        #region Phương thức xóa 1 lịch sử giao dịch
        /// <summary>
        /// Phương thức xóa 1 lịch sử giao dịch
        /// </summary>
        /// <param name="lsgd"></param>
        /// <returns></returns>
        public int Xoa(LichSuGiaoDichDTO lsgdDTO)
        {            
            int _index = -1;
            try
            { 
                // Mở kết nối
                _dbmanager.Open();

                // Thực thi câu truy vấn
                _dbmanager.CreateParameters(1);
                _dbmanager.AddParameters(0, "@ma_lsgd", lsgdDTO.MaLichSuGiaoDich);
                _index = _dbmanager.ExecuteNonQuery(CommandType.StoredProcedure, "usp_XoaLichSuGiaoDich");
            }
            catch (Exception ex)
            {
                throw new Exception(ex.Message);
            }
            finally
            {
                if (_dbmanager.Connection.State == ConnectionState.Open)
                    _dbmanager.Close();
            }

            return _index;

        }
        #endregion
    }
}
